﻿using System;
using System.Collections.Generic;

namespace WUDI.ECharts.Series.Lines
{
	public class Lines
	{

		public String type { get; set; } = "lines";

		/// <summary>
		/// string
		/// 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引用组件。
		/// </summary>
		public String id { get; set; }

		/// <summary>
		/// string
		/// 系列名称，用于tooltip的显示，legend 的图例筛选，在 setOption 更新数据和配置项时用于指定对应的系列。
		/// </summary>
		public String name { get; set; }

		/// <summary>
		/// string
		/// 该系列使用的坐标系，可选：
		/// 'cartesian2d'
		///   使用二维的直角坐标系（也称笛卡尔坐标系），通过 xAxisIndex, yAxisIndex指定相应的坐标轴组件。
		/// 'geo'
		///   使用地理坐标系，通过 geoIndex 指定相应的地理坐标系组件。
		/// </summary>
		public HeatmapCoordinateSystem coordinateSystem { get; set; } = HeatmapCoordinateSystem.geo;

		/// <summary>
		/// number
		/// 使用的 x 轴的 index，在单个图表实例中存在多个 x 轴的时候有用。
		/// </summary>
		public int xAxisIndex { get; set; } = 0;

		/// <summary>
		/// number
		/// 使用的 y 轴的 index，在单个图表实例中存在多个 y轴的时候有用。
		/// </summary>
		public int yAxisIndex { get; set; } = 0;

		/// <summary>
		/// number
		/// 使用的地理坐标系的 index，在单个图表实例中存在多个地理坐标系的时候有用。
		/// </summary>
		public int geoIndex { get; set; } = 0;

		/// <summary>
		/// boolean
		/// 是否是多段线。
		/// 默认为 false，只能用于绘制只有两个端点的线段，线段可以通过 lineStyle.curveness 配置为曲线。
		/// 如果该配置项为 true，则可以在 data.coords 中设置多于 2 个的顶点用来绘制多段线，在绘制路线轨迹的时候比较有用，见示例 北京公交路线，设置为多段线后 lineStyle.curveness 无效。
		/// </summary>
		public Boolean polyline { get; set; } = false;

		/// <summary>
		/// Object
		/// 线特效的配置，见示例 模拟迁徙 和 北京公交路线
		/// 注意： 所有带有尾迹特效的图表需要单独放在一个层，也就是需要单独设置 zlevel，同时建议关闭该层的动画（animation: false）。不然位于同个层的其它系列的图形，和动画的标签也会产生不必要的残影。
		/// </summary>
		public WUDI.ECharts.Series.Lines.Effect.Effect effect { get; set; }

		/// <summary>
		/// boolean
		/// 是否启用大规模线图的优化，在数据图形特别多的时候（>=5k）可以开启。
		/// 开启后配合 largeThreshold 在数据量大于指定阈值的时候对绘制进行优化。
		/// 缺点：优化后不能自定义设置单个数据项的样式，不能启用 effect。
		/// </summary>
		public Boolean large { get; set; } = false;

		/// <summary>
		/// number
		/// 开启绘制优化的阈值。
		/// </summary>
		public int largeThreshold { get; set; } = 2000;

		/// <summary>
		/// string,Array
		/// 线两端的标记类型，可以是一个数组分别指定两端，也可以是单个统一指定。
		/// 具体支持的格式可以参考 标线的 symbol
		/// </summary>
		public dynamic symbol { get; set; } = "none";

		/// <summary>
		/// number,Array
		/// 线两端的标记大小，可以是一个数组分别指定两端，也可以是单个统一指定。
		/// 注意： 这里无法像一般的 symbolSize 那样通过数组分别指定高宽。
		/// </summary>
		public dynamic symbolSize { get; set; } = 10;

		/// <summary>
		/// Object
		/// </summary>
		public WUDI.ECharts.Series.Lines.LineStyle.LineStyle lineStyle { get; set; }

		/// <summary>
		/// Object
		/// 标签相关配置。在 polyline 设置为 true 时无效。
		/// </summary>
		public WUDI.ECharts.Series.Lines.Label.Label label { get; set; }

		/// <summary>
		/// Object
		/// 高亮的线条和标签样式。
		/// </summary>
		public WUDI.ECharts.Series.Lines.Emphasis.Emphasis emphasis { get; set; }

		/// <summary>
		/// number
		/// 渐进式渲染时每一帧绘制图形数量，设为 0 时不启用渐进式渲染，支持每个系列单独配置。
		/// 在图中有数千到几千万图形元素的时候，一下子把图形绘制出来，或者交互重绘的时候可能会造成界面的卡顿甚至假死。ECharts 4 开始全流程支持渐进渲染（progressive rendering），渲染的时候会把创建好的图形分到数帧中渲染，每一帧渲染只渲染指定数量的图形。
		/// 该配置项就是用于配置该系列每一帧渲染的图形数，可以根据图表图形复杂度的需要适当调整这个数字使得在不影响交互流畅性的前提下达到绘制速度的最大化。比如在 lines 图或者平行坐标中线宽大于 1 的 polyline 绘制会很慢，这个数字就可以设置小一点，而线宽小于等于 1 的 polyline 绘制非常快，该配置项就可以相对调得比较大。
		/// </summary>
		public int progressive { get; set; } = 400;

		/// <summary>
		/// number
		/// 启用渐进式渲染的图形数量阈值，在单个系列的图形数量超过该阈值时启用渐进式渲染。
		/// </summary>
		public int progressiveThreshold { get; set; } = 3000;

		/// <summary>
		/// Array
		/// 线数据集。
		/// 注： 为了更好点支持多段线的配置，线数据的格式在 3.2.0 做了一定调整，如下：
		/// // 3.2.0 之前
		/// // [{
		/// //    // 起点坐标
		/// //    coord: [120, 66],
		/// //    lineStyle: { }
		/// // }, {
		/// //    // 终点坐标
		/// //    coord: [122, 67]
		/// // }]
		/// // 从 3.2.0 起改为如下配置
		/// {
		///     coords: [
		///         [120, 66],  // 起点
		///         [122, 67]   // 终点
		///         ...         // 如果 polyline 为 true 还可以设置更多的点
		///     ],
		///     // 统一的样式设置
		///     lineStyle: {
		///     }
		/// }
		/// </summary>
		public List<object> data { get; set; }

		/// <summary>
		/// Object
		/// 图表标注。
		/// </summary>
		public WUDI.ECharts.Series.Lines.MarkPoint.MarkPoint markPoint { get; set; }

		/// <summary>
		/// *
		/// 图表标线。
		/// </summary>
		public WUDI.ECharts.Series.Lines.MarkLine.MarkLine markLine { get; set; }

		/// <summary>
		/// Object
		/// 图表标域，常用于标记图表中某个范围的数据，例如标出某段时间投放了广告。
		/// </summary>
		public WUDI.ECharts.Series.Lines.MarkArea.MarkArea markArea { get; set; }

		/// <summary>
		/// boolean
		/// 从 4.4.0 开始支持
		/// 是否裁剪超出坐标系部分的图形，具体裁剪效果根据系列决定：
		/// 散点图：忽略中心点超出坐标系的图形，但是不裁剪单个图形
		/// 柱状图：裁掉所有超出坐标系的部分，但是依然保留柱子的宽度
		/// 折线图：裁掉所有超出坐标系的折线部分，拐点图形的逻辑按照散点图处理
		/// 路径图：裁掉所有超出坐标系的部分
		/// 自定义系列：裁掉所有超出坐标系的部分
		/// 除了自定义系列，其它系列的默认值都为 true，及开启裁剪，如果你觉得不想要裁剪的话，可以设置成 false 关闭。
		/// </summary>
		public Boolean clip { get; set; } = true;

		/// <summary>
		/// number
		/// 线图所有图形的 zlevel 值。
		/// zlevel用于 Canvas 分层，不同zlevel值的图形会放置在不同的 Canvas 中，Canvas 分层是一种常见的优化手段。我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的 Canvas 会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
		/// zlevel 大的 Canvas 会放在 zlevel 小的 Canvas 的上面。
		/// </summary>
		public int zlevel { get; set; } = 0;

		/// <summary>
		/// number
		/// 线图组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
		/// z相比zlevel优先级更低，而且不会创建新的 Canvas。
		/// </summary>
		public int z { get; set; } = 2;

		/// <summary>
		/// boolean
		/// 图形是否不响应和触发鼠标事件，默认为 false，即响应和触发鼠标事件。
		/// </summary>
		public Boolean silent { get; set; } = false;

		/// <summary>
		/// boolean
		/// 是否开启动画。
		/// </summary>
		public Boolean animation { get; set; } = true;

		/// <summary>
		/// number
		/// 是否开启动画的阈值，当单个系列显示的图形数量大于这个阈值时会关闭动画。
		/// </summary>
		public int animationThreshold { get; set; } = 2000;

		/// <summary>
		/// number
		/// 初始动画的时长，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果：
		/// animationDuration: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public int animationDuration { get; set; } = 1000;

		/// <summary>
		/// string
		/// 初始动画的缓动效果。不同的缓动效果可以参考 缓动示例。
		/// </summary>
		public String animationEasing { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 初始动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
		/// 如下示例：
		/// animationDelay: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelay { get; set; } = 0;

		/// <summary>
		/// number,Function
		/// 数据更新动画的时长。
		/// 支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果：
		/// animationDurationUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public dynamic animationDurationUpdate { get; set; } = 300;

		/// <summary>
		/// string
		/// 数据更新动画的缓动效果。
		/// </summary>
		public String animationEasingUpdate { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 数据更新动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
		/// 如下示例：
		/// animationDelayUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelayUpdate { get; set; } = 0;

	}
}
